#ifndef INTERPRETEXML_HPP
#define INTERPRETEXML_HPP

#include <QtCore/QObject>

class QXmlStreamReader;
class QIODevice;
class DescriptionFichier;
class StructureDonnees;

/** Classe qui permet l'interprétation d'un fichier XML de l'API croquemonster.
  * La classe récupère le contenu attendu du fichier XML de l'API avec une
  * instance de \c DescriptionFichier, ce qui permet de ne charger en mémoire
  * que les informations nécessaires.
  *
  * @author Johan "Solo" Luisier
  * @date Octobre 2011
  */
class InterpreteXml : public QObject
{
    Q_OBJECT
public:
    /** Constructeur standard.
      * On récupère premièrement la description du fichier qui sera lu dans
      * @c ContenuAttendu. Si cette description ne peut être lue, alors le
      * programme est interrompu.
      *
      * @todo Lancer une exception si la description n'existe pas?
      *
      * @param[in] typeFichier type de fichier ("agency", "contracts", ...).
      * @param[in] parent pointeur sur le QObject parent.
      */
    InterpreteXml( const QString& typeFichier, QObject * parent = 0 );
    /** Destructeur.
      * Le destructeur n'a rien de spécial à faire.
      */
    virtual ~InterpreteXml();
    /** Permet d'initialiser le parseur XML.
      *
      * @param[in] entree pointeur sur le fichier XML récupéré.
      */
    void setEntree( QIODevice * entree );
    /** Méthode qui effectue la lecture des données.
      * La lecture est interrompue si le parseur n'est pas initialisé (appel à
      * setEntree non effectué), si le site est temporairement indisponible,
      * si une erreur de mot de passe, user ou nom syndicat est détectée.
      *
      * @param[out] donnees instance de @c StructureDonnees qui contient les
      * informations extraites du fichier, conformément à la description.
      *
      * @return 0 si tout s'est bien déroulé, ou un code d'erreur, qui peut
      * provenir de QXmlStreamReader.
      */
    unsigned lireEntree( StructureDonnees& donnees );
    /** Méthode responsable de traiter les erreurs de connections.
      * L'erreur peut être inconnue, "utilisateur inconnu", "syndicat inconnu",
      * "accès API non autorisé" ou "mot de passe API erroné".
      *
      * @return 30 si l'erreur est connue, ou alors -1u.
      */
    unsigned traitementException();
protected:
    /** Pointeur sur la description du fichier XML qui sera lu.
      */
    const DescriptionFichier * ContenuAttendu;
    /** Instance de parser XML.
      */
    QXmlStreamReader * Parseur;
    /** Membre qui régit l'affichage de message de debug.
      */
    bool AfficheMessageDebuging;
};

#endif // INTERPRETEXML_HPP
